λͺ¨λ Έλ ν¬ λ΄ μ¬λ¬ ν¨ν€μ§μμ TypeScript νμ μ ν¨μ¨μ μΌλ‘ 곡μ νλ μ λ΅μ νμνμ¬ μ½λ μ μ§λ³΄μμ±κ³Ό κ°λ°μ μμ°μ±μ ν₯μμν€μΈμ.
TypeScript λͺ¨λ Έλ ν¬: λ©ν° ν¨ν€μ§ νμ 곡μ μ λ΅
μ¬λ¬ ν¨ν€μ§ λλ νλ‘μ νΈλ₯Ό ν¬ν¨νλ μ μ₯μμΈ λͺ¨λ Έλ ν¬λ λκ·λͺ¨ μ½λλ² μ΄μ€λ₯Ό κ΄λ¦¬νλ λ° μ μ λ μΈκΈ°λ₯Ό μ»κ³ μμ΅λλ€. λͺ¨λ Έλ ν¬λ μ½λ 곡μ κ°μ , μ’ μμ± κ΄λ¦¬ κ°μν, νμ κ°ν λ± μ¬λ¬ μ΄μ μ μ 곡ν©λλ€. κ·Έλ¬λ λͺ¨λ Έλ ν¬ λ΄ μ¬λ¬ ν¨ν€μ§μμ TypeScript νμ μ ν¨κ³Όμ μΌλ‘ 곡μ νλ €λ©΄ μ μ€ν κ³νκ³Ό μ λ΅μ μΈ κ΅¬νμ΄ νμν©λλ€.
TypeScriptμ ν¨κ» λͺ¨λ Έλ ν¬λ₯Ό μ¬μ©νλ μ΄μ ?
νμ 곡μ μ λ΅μ μμΈν μμ보기 μ μ, νΉν TypeScriptλ‘ μμ ν λ λͺ¨λ Έλ ν¬ μ κ·Ό λ°©μμ΄ μ μ μ΅νμ§ μ΄ν΄λ³΄κ² μ΅λλ€:
- μ½λ μ¬μ¬μ©: λͺ¨λ Έλ ν¬λ μ¬λ¬ νλ‘μ νΈμμ μ½λ κ΅¬μ± μμλ₯Ό μ¬μ¬μ©νλλ‘ κΆμ₯ν©λλ€. 곡μ νμ μ μΌκ΄μ±μ 보μ₯νκ³ μ€λ³΅μ μ€μ΄λ λ° νμμ μ λλ€. κ΅¬μ± μμμ λν νμ μ μκ° μ¬λ¬ νλ°νΈμλ μ ν리μΌμ΄μ μμ μ¬μ©λλ UI λΌμ΄λΈλ¬λ¦¬λ₯Ό μμν΄ λ³΄μΈμ.
- κ°μνλ μ’ μμ± κ΄λ¦¬: λͺ¨λ Έλ ν¬ λ΄ ν¨ν€μ§ κ°μ μ’ μμ±μ μΌλ°μ μΌλ‘ λ΄λΆμ μΌλ‘ κ΄λ¦¬λλ―λ‘, λ΄λΆ μ’ μμ±μ μν΄ μΈλΆ λ μ§μ€νΈλ¦¬μμ ν¨ν€μ§λ₯Ό λ°ννκ³ μ¬μ©ν νμκ° μμ΅λλ€. λν λ΄λΆ ν¨ν€μ§ κ°μ λ²μ μΆ©λμ λ°©μ§ν©λλ€. `npm link`, `yarn link` λλ Lerna, Nx, Turborepoμ κ°μ λ³΄λ€ μ κ΅ν λͺ¨λ Έλ ν¬ κ΄λ¦¬ λκ΅¬κ° μ΄λ₯Ό μ©μ΄νκ² ν©λλ€.
- μμμ λ³κ²½: μ¬λ¬ ν¨ν€μ§μ κ±Έμ³ μλ λ³κ²½ μ¬νμ ν¨κ» 컀λ°λκ³ λ²μ μ΄ μ§μ λμ΄ μΌκ΄μ±μ 보μ₯νκ³ λ¦΄λ¦¬μ€λ₯Ό κ°μνν©λλ€. μλ₯Ό λ€μ΄, APIμ νλ°νΈμλ ν΄λΌμ΄μΈνΈμ λͺ¨λ μν₯μ λ―ΈμΉλ 리ν©ν λ§μ λ¨μΌ 컀λ°μΌλ‘ μνλ μ μμ΅λλ€.
- ν₯μλ νμ : λ¨μΌ μ μ₯μλ κ°λ°μ κ°μ λ λμ νμ μ μ΄μ§νκ³ λͺ¨λ μ½λλ₯Ό μν μ€μ μ§μ€μ μμΉλ₯Ό μ 곡ν©λλ€. λͺ¨λ μ¬λμ΄ μμ μ μ½λκ° μλνλ 컨ν μ€νΈλ₯Ό λ³Ό μ μμ΄ μ΄ν΄λ₯Ό λμ΄κ³ νΈνλμ§ μλ μ½λκ° ν΅ν©λ κ°λ₯μ±μ μ€μ λλ€.
- λ μ¬μ΄ 리ν©ν λ§: λͺ¨λ Έλ ν¬λ μ¬λ¬ ν¨ν€μ§μ κ±ΈμΉ λκ·λͺ¨ 리ν©ν λ§μ μ©μ΄νκ² ν μ μμ΅λλ€. λͺ¨λ Έλ ν¬ μ 체μ ν΅ν©λ TypeScript μ§μμ λκ΅¬κ° νκ΄΄μ μΈ λ³κ²½ μ¬νμ μλ³νκ³ μ½λλ₯Ό μμ νκ² λ¦¬ν©ν λ§νλ λ° λμμ μ€λλ€.
λͺ¨λ Έλ ν¬μμ νμ 곡μ μ μ΄λ €μ
λͺ¨λ Έλ ν¬λ λ§μ μ΄μ μ μ 곡νμ§λ§, νμ μ ν¨κ³Όμ μΌλ‘ 곡μ νλ κ²μ λͺ κ°μ§ μ΄λ €μμ μΌκΈ°ν μ μμ΅λλ€:
- μν μ’ μμ±: ν¨ν€μ§ κ°μ μν μ’ μμ±μ λΉλ μ€λ₯ λ° λ°νμ λ¬Έμ λ‘ μ΄μ΄μ§ μ μμΌλ―λ‘ μ΄λ₯Ό νΌνλλ‘ μ£Όμν΄μΌ ν©λλ€. νμ μ μλ μ½κ² μν μ’ μμ±μ μμ±ν μ μμΌλ―λ‘ μ μ€ν μν€ν μ²κ° νμν©λλ€.
- λΉλ μ±λ₯: λκ·λͺ¨ λͺ¨λ Έλ ν¬λ λΉλ μκ°μ΄ λλ €μ§ μ μμΌλ©°, νΉν νλμ ν¨ν€μ§ λ³κ²½μ΄ λ§μ μ’ μ ν¨ν€μ§μ μ¬λΉλλ₯Ό μ λ°νλ κ²½μ° λμ± κ·Έλ μ΅λλ€. μ¦λΆ λΉλ λꡬλ μ΄λ₯Ό ν΄κ²°νλ λ° νμμ μ λλ€.
- 볡μ‘μ±: λ¨μΌ μ μ₯μμμ λ§μ μμ ν¨ν€μ§λ₯Ό κ΄λ¦¬νλ κ²μ 볡μ‘μ±μ μ¦κ°μν¬ μ μμΌλ©°, κ°λ ₯ν λꡬμ λͺ νν μν€ν μ² μ§μΉ¨μ΄ νμν©λλ€.
- λ²μ κ΄λ¦¬: λͺ¨λ Έλ ν¬ λ΄μμ ν¨ν€μ§ λ²μ μ κ΄λ¦¬νλ λ°©λ²μ κ²°μ νλ κ²μ μ μ€ν κ³ λ €κ° νμν©λλ€. λ 립μ μΈ λ²μ κ΄λ¦¬(κ° ν¨ν€μ§κ° κ³ μ ν λ²μ λ²νΈλ₯Ό κ°μ§) λλ κ³ μ λ²μ κ΄λ¦¬(λͺ¨λ ν¨ν€μ§κ° λμΌν λ²μ λ²νΈλ₯Ό 곡μ ν¨)κ° μΌλ°μ μΈ μ κ·Ό λ°©μμ λλ€.
TypeScript νμ 곡μ μ λ΅
λ€μμ λͺ¨λ Έλ ν¬ λ΄μμ ν¨ν€μ§ κ°μ TypeScript νμ μ 곡μ νλ λͺ κ°μ§ μ λ΅κ³Ό κ·Έ μ₯λ¨μ μ λλ€:
1. νμ μ μ© κ³΅μ ν¨ν€μ§
κ°μ₯ κ°λ¨νκ³ μ’ μ’ κ°μ₯ ν¨κ³Όμ μΈ μ λ΅μ 곡μ νμ μ μλ₯Ό 보κ΄νκΈ° μν΄ νΉλ³ν μ μ© ν¨ν€μ§λ₯Ό μμ±νλ κ²μ λλ€. μ΄ ν¨ν€μ§λ λͺ¨λ Έλ ν¬ λ΄μ λ€λ₯Έ ν¨ν€μ§μμ κ°μ Έμ¬ μ μμ΅λλ€.
ꡬν:
- μΌλ°μ μΌλ‘ `@your-org/types` λλ `shared-types`μ κ°μ μ΄λ¦μΌλ‘ μ ν¨ν€μ§λ₯Ό μμ±ν©λλ€.
- μ΄ ν¨ν€μ§ λ΄μ λͺ¨λ 곡μ νμ μ μλ₯Ό μ μν©λλ€.
- μ΄ ν¨ν€μ§λ₯Ό λ°ν(λ΄λΆ λλ μΈλΆ)νκ³ λ€λ₯Έ ν¨ν€μ§μ μ’ μμ±μΌλ‘ κ°μ Έμ΅λλ€.
μμ:
λ κ°μ ν¨ν€μ§μΈ `api-client`μ `ui-components`κ° μλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€. μ΄λ€ κ°μ `User` κ°μ²΄μ λν νμ μ μλ₯Ό 곡μ νλ €κ³ ν©λλ€.
`@your-org/types/src/user.ts`:
export interface User {
id: string;
name: string;
email: string;
role: 'admin' | 'user';
}
`api-client/src/index.ts`:
import { User } from '@your-org/types';
export async function fetchUser(id: string): Promise<User> {
// ... fetch user data from API
}
`ui-components/src/UserCard.tsx`:
import { User } from '@your-org/types';
interface Props {
user: User;
}
export function UserCard(props: Props) {
return (
<div>
<h2>{props.user.name}</h2>
<p>{props.user.email}</p>
</div>
);
}
μ₯μ :
- κ°λ¨νκ³ λͺ νν¨: μ΄ν΄νκ³ κ΅¬ννκΈ° μ½μ΅λλ€.
- μ€μ μ§μ€μ νμ μ μ: μΌκ΄μ±μ 보μ₯νκ³ μ€λ³΅μ μ€μ λλ€.
- λͺ μμ μ’ μμ±: μ΄λ€ ν¨ν€μ§κ° 곡μ νμ μ μ’ μλλμ§ λͺ ννκ² μ μν©λλ€.
λ¨μ :
- λ°ν νμ: λ΄λΆ ν¨ν€μ§λΌλ λ°νμ΄ νμν κ²½μ°κ° λ§μ΅λλ€.
- λ²μ κ΄λ¦¬ μ€λ²ν€λ: 곡μ νμ ν¨ν€μ§μ λ³κ²½μ λ€λ₯Έ ν¨ν€μ§μ μ’ μμ±μ μ λ°μ΄νΈν΄μΌ ν μ μμ΅λλ€.
- κ³Όλν μΌλ°ν κ°λ₯μ±: 곡μ νμ ν¨ν€μ§κ° λ무 κ΄λ²μν΄μ Έμ μΌλΆ ν¨ν€μ§μμλ§ μ¬μ©λλ νμ μ ν¬ν¨ν μ μμ΅λλ€. μ΄λ ν¨ν€μ§μ μ 체 ν¬κΈ°λ₯Ό μ¦κ°μν€κ³ λΆνμν μ’ μμ±μ λμ ν μ μμ΅λλ€.
2. κ²½λ‘ λ³μΉ
TypeScriptμ κ²½λ‘ λ³μΉμ μ¬μ©νλ©΄ κ°μ Έμ€κΈ° κ²½λ‘λ₯Ό λͺ¨λ Έλ ν¬ λ΄μ νΉμ λλ ν 리μ λ§€νν μ μμ΅λλ€. μ΄λ λ³λμ ν¨ν€μ§λ₯Ό λͺ μμ μΌλ‘ μμ±νμ§ μκ³ λ νμ μ μλ₯Ό 곡μ νλ λ° μ¬μ©λ μ μμ΅λλ€.
ꡬν:
- μ§μ λ λλ ν 리(μ: `shared/types`)μ 곡μ νμ μ μλ₯Ό μ μν©λλ€.
- 곡μ νμ μ μ κ·Όν΄μΌ νλ κ° ν¨ν€μ§μ `tsconfig.json` νμΌμ κ²½λ‘ λ³μΉμ ꡬμ±ν©λλ€.
μμ:
`tsconfig.json` (`api-client` λ° `ui-components` λ΄):
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@shared/*": ["../shared/types/*"]
}
}
}
`shared/types/user.ts`:
export interface User {
id: string;
name: string;
email: string;
role: 'admin' | 'user';
}
`api-client/src/index.ts`:
import { User } from '@shared/user';
export async function fetchUser(id: string): Promise<User> {
// ... fetch user data from API
}
`ui-components/src/UserCard.tsx`:
import { User } from '@shared/user';
interface Props {
user: User;
}
export function UserCard(props: Props) {
return (
<div>
<h2>{props.user.name}</h2>
<p>{props.user.email}</p>
</div>
);
}
μ₯μ :
- λ°ν νμ μμ: ν¨ν€μ§λ₯Ό λ°ννκ³ μ¬μ©ν νμκ° μμ΅λλ€.
- κ°λ¨ν μ€μ : κ²½λ‘ λ³μΉμ `tsconfig.json`μμ λΉκ΅μ μ½κ² μ€μ ν μ μμ΅λλ€.
- μμ€ μ½λμ μ§μ μ κ·Ό: 곡μ νμ λ³κ²½ μ¬νμ΄ μ’ μ ν¨ν€μ§μ μ¦μ λ°μλ©λλ€.
λ¨μ :
- μμμ μ’ μμ±: 곡μ νμ μ λν μ’ μμ±μ΄ `package.json`μ λͺ μμ μΌλ‘ μ μΈλμ§ μμ΅λλ€.
- κ²½λ‘ λ¬Έμ : λͺ¨λ Έλ ν¬κ° 컀μ§κ³ λλ ν 리 κ΅¬μ‘°κ° λ³΅μ‘ν΄μ§μ λ°λΌ κ΄λ¦¬νκΈ°κ° λ³΅μ‘ν΄μ§ μ μμ΅λλ€.
- μ΄λ¦ μΆ©λ κ°λ₯μ±: 곡μ νμ κ³Ό λ€λ₯Έ λͺ¨λ κ°μ μ΄λ¦ μΆ©λμ νΌνλλ‘ μ£Όμν΄μΌ ν©λλ€.
3. λ³΅ν© νλ‘μ νΈ
TypeScriptμ λ³΅ν© νλ‘μ νΈ(Composite Projects) κΈ°λ₯μ λͺ¨λ Έλ ν¬λ₯Ό μνΈ μ°κ²°λ νλ‘μ νΈ μ§ν©μΌλ‘ ꡬμ±ν μ μκ² ν©λλ€. μ΄λ μ¦λΆ λΉλλ₯Ό κ°λ₯νκ² νκ³ ν¨ν€μ§ κ²½κ³λ₯Ό λμ΄ κ°μ λ νμ κ²μ¬λ₯Ό μ 곡ν©λλ€.
ꡬν:
- λͺ¨λ Έλ ν¬μ κ° ν¨ν€μ§μ λν΄ `tsconfig.json` νμΌμ μμ±ν©λλ€.
- 곡μ νμ μ μ’ μλλ ν¨ν€μ§μ `tsconfig.json` νμΌμ 곡μ νμ μ ν¬ν¨νλ ν¨ν€μ§μ `tsconfig.json` νμΌμ κ°λ¦¬ν€λ `references` λ°°μ΄μ μΆκ°ν©λλ€.
- κ° `tsconfig.json` νμΌμ `compilerOptions`μμ `composite` μ΅μ μ νμ±νν©λλ€.
μμ:
`shared-types/tsconfig.json`:
{
"compilerOptions": {
"composite": true,
"declaration": true,
"module": "esnext",
"moduleResolution": "node",
"esModuleInterop": true,
"outDir": "dist",
"rootDir": "src",
"strict": true
},
"include": ["src"]
}
`api-client/tsconfig.json`:
{
"compilerOptions": {
"composite": true,
"module": "esnext",
"moduleResolution": "node",
"esModuleInterop": true,
"outDir": "dist",
"rootDir": "src",
"strict": true
},
"include": ["src"],
"references": [{
"path": "../shared-types"
}]
}
`ui-components/tsconfig.json`:
{
"compilerOptions": {
"composite": true,
"module": "esnext",
"moduleResolution": "node",
"esModuleInterop": true,
"outDir": "dist",
"rootDir": "src",
"strict": true
},
"include": ["src"],
"references": [{
"path": "../shared-types"
}]
}
`shared-types/src/user.ts`:
export interface User {
id: string;
name: string;
email: string;
role: 'admin' | 'user';
}
`api-client/src/index.ts`:
import { User } from 'shared-types';
export async function fetchUser(id: string): Promise<User> {
// ... fetch user data from API
}
`ui-components/src/UserCard.tsx`:
import { User } from 'shared-types';
interface Props {
user: User;
}
export function UserCard(props: Props) {
return (
<div>
<h2>{props.user.name}</h2>
<p>{props.user.email}</p>
</div>
);
}
μ₯μ :
- μ¦λΆ λΉλ: λ³κ²½λ ν¨ν€μ§μ ν΄λΉ μ’ μμ±λ§ μ¬λΉλλ©λλ€.
- ν₯μλ νμ κ²μ¬: TypeScriptλ ν¨ν€μ§ κ²½κ³λ₯Ό λμ΄ λ μ² μ ν νμ κ²μ¬λ₯Ό μνν©λλ€.
- λͺ μμ μ’ μμ±: ν¨ν€μ§ κ°μ μ’ μμ±μ΄ `tsconfig.json`μ λͺ ννκ² μ μλ©λλ€.
λ¨μ :
- λ 볡μ‘ν ꡬμ±: 곡μ ν¨ν€μ§ λλ κ²½λ‘ λ³μΉ μ κ·Ό λ°©μλ³΄λ€ λ λ§μ ꡬμ±μ΄ νμν©λλ€.
- μν μ’ μμ± κ°λ₯μ±: νλ‘μ νΈ κ°μ μν μ’ μμ±μ νΌνλλ‘ μ£Όμν΄μΌ ν©λλ€.
4. ν¨ν€μ§μ 곡μ νμ λ²λ€λ§ (μ μΈ νμΌ)
ν¨ν€μ§κ° λΉλλ λ, TypeScriptλ λ΄λ³΄λΈ μ½λμ ννλ₯Ό μ€λͺ νλ μ μΈ νμΌ(`d.ts`)μ μμ±ν μ μμ΅λλ€. μ΄ μ μΈ νμΌμ ν¨ν€μ§κ° μ€μΉλ λ μλμΌλ‘ ν¬ν¨λ μ μμ΅λλ€. μ΄λ₯Ό νμ©νμ¬ κ΄λ ¨ ν¨ν€μ§μ 곡μ νμ μ ν¬ν¨ν μ μμ΅λλ€. μ΄λ μΌλ°μ μΌλ‘ λ€λ₯Έ ν¨ν€μ§μ νμν νμ μ΄ μμμ΄κ³ , μ μλ ν¨ν€μ§μ λ³Έμ§μ μΌλ‘ μ°κ²°λμ΄ μμ λ μ μ©ν©λλ€.
ꡬν:
- ν¨ν€μ§ λ΄μ νμ μ μ μν©λλ€ (μ: `api-client`).
- ν΄λΉ ν¨ν€μ§μ `tsconfig.json`μ μλ `compilerOptions`μ `declaration: true`κ° μ€μ λμ΄ μλμ§ νμΈν©λλ€.
- ν¨ν€μ§λ₯Ό λΉλνλ©΄ JavaScriptμ ν¨κ» `.d.ts` νμΌμ΄ μμ±λ©λλ€.
- λ€λ₯Έ ν¨ν€μ§λ `api-client`λ₯Ό μ’ μμ±μΌλ‘ μ€μΉν λ€μ ν΄λΉ ν¨ν€μ§μμ μ§μ νμ μ κ°μ Έμ¬ μ μμ΅λλ€.
μμ:
`api-client/tsconfig.json`:
{
"compilerOptions": {
"declaration": true,
"module": "esnext",
"moduleResolution": "node",
"esModuleInterop": true,
"outDir": "dist",
"rootDir": "src",
"strict": true
},
"include": ["src"]
}
`api-client/src/user.ts`:
export interface User {
id: string;
name: string;
email: string;
role: 'admin' | 'user';
}
`api-client/src/index.ts`:
export * from './user';
export async function fetchUser(id: string): Promise<User> {
// ... fetch user data from API
}
`ui-components/src/UserCard.tsx`:
import { User } from 'api-client';
interface Props {
user: User;
}
export function UserCard(props: Props) {
return (
<div>
<h2>{props.user.name}</h2>
<p>{props.user.email}</p>
</div>
);
}
μ₯μ :
- νμ μ΄ μ€λͺ νλ μ½λμ ν¨κ» μμΉν¨: νμ μ΄ μλ ν¨ν€μ§μ λ°μ νκ² μ°κ²°λ©λλ€.
- νμ μ λν λ³λμ λ°ν λ¨κ³ μμ: νμ μ΄ ν¨ν€μ§μ μλμΌλ‘ ν¬ν¨λ©λλ€.
- κ΄λ ¨ νμ μ μ’ μμ± κ΄λ¦¬ κ°μν: UI κ΅¬μ± μμκ° API ν΄λΌμ΄μΈνΈμ User νμ μ λ°μ νκ² μ°κ²°λμ΄ μλ€λ©΄ μ΄ μ κ·Ό λ°©μμ΄ μ μ©ν μ μμ΅λλ€.
λ¨μ :
- νμ μ νΉμ ꡬνμ λ¬Άμ: ꡬν ν¨ν€μ§μ λ 립μ μΌλ‘ νμ μ 곡μ νκΈ° μ΄λ ΅κ² λ§λλλ€.
- ν¨ν€μ§ ν¬κΈ° μ¦κ° κ°λ₯μ±: ν¨ν€μ§μ λͺλͺ λ€λ₯Έ ν¨ν€μ§μμλ§ μ¬μ©λλ λ§μ νμ μ΄ ν¬ν¨λμ΄ μλ€λ©΄, ν¨ν€μ§μ μ 체 ν¬κΈ°κ° μ¦κ°ν μ μμ΅λλ€.
- μ± μ λΆλ¦¬μ λͺ νμ± κ°μ: νμ μ μμ ꡬν μ½λλ₯Ό νΌν©νμ¬ μ½λλ² μ΄μ€λ₯Ό μΆλ‘ νκΈ° λ μ΄λ ΅κ² λ§λ€ μ μμ΅λλ€.
μ¬λ°λ₯Έ μ λ΅ μ ν
λͺ¨λ Έλ ν¬μμ TypeScript νμ μ 곡μ νλ κ°μ₯ μ’μ μ λ΅μ νλ‘μ νΈμ νΉμ μꡬ μ¬νμ λ°λΌ λ¬λΌμ§λλ€. λ€μ μμλ₯Ό κ³ λ €νμμμ€:
- 곡μ νμ μ μ: 곡μ νμ μ μκ° μ λ€λ©΄ 곡μ ν¨ν€μ§ λλ κ²½λ‘ λ³μΉμΌλ‘ μΆ©λΆν μ μμ΅λλ€. 곡μ νμ μ μκ° λ§λ€λ©΄ λ³΅ν© νλ‘μ νΈκ° λ λμ μ νμΌ μ μμ΅λλ€.
- λͺ¨λ Έλ ν¬μ 볡μ‘μ±: κ°λ¨ν λͺ¨λ Έλ ν¬μ κ²½μ° κ³΅μ ν¨ν€μ§ λλ κ²½λ‘ λ³μΉμ΄ κ΄λ¦¬νκΈ° λ μ¬μΈ μ μμ΅λλ€. λ 볡μ‘ν λͺ¨λ Έλ ν¬μ κ²½μ° λ³΅ν© νλ‘μ νΈκ° λ λμ ꡬμ±κ³Ό λΉλ μ±λ₯μ μ 곡ν μ μμ΅λλ€.
- 곡μ νμ λ³κ²½ λΉλ: 곡μ νμ μ΄ μμ£Ό λ³κ²½λλ€λ©΄ μ¦λΆ λΉλλ₯Ό κ°λ₯νκ² νλ λ³΅ν© νλ‘μ νΈκ° μ΅μ μ μ νμΌ μ μμ΅λλ€.
- ꡬνκ³Όμ νμ κ²°ν©: νμ μ΄ νΉμ ν¨ν€μ§μ λ°μ νκ² κ²°ν©λμ΄ μλ€λ©΄ μ μΈ νμΌμ μ¬μ©νμ¬ νμ μ λ²λ€λ§νλ κ²μ΄ ν©λ¦¬μ μ λλ€.
νμ 곡μ λ₯Ό μν λͺ¨λ² μ¬λ‘
μ΄λ€ μ λ΅μ μ ννλ , λͺ¨λ Έλ ν¬μμ TypeScript νμ μ 곡μ νκΈ° μν λͺ κ°μ§ λͺ¨λ² μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€:
- μν μ’ μμ± νΌνκΈ°: μν μ’ μμ±μ νΌνλλ‘ ν¨ν€μ§μ κ·Έ μ’ μμ±μ μ μ€νκ² μ€κ³νμΈμ. μ΄λ₯Ό κ°μ§νκ³ λ°©μ§νλ λꡬλ₯Ό μ¬μ©νμΈμ.
- νμ μ μλ₯Ό κ°κ²°νκ³ μ§μ€μ μΌλ‘ μ μ§: λͺ¨λ ν¨ν€μ§μμ μ¬μ©λμ§ μλ μ§λμΉκ² κ΄λ²μν νμ μ μ μμ±μ νΌνμΈμ.
- νμ μ μ€λͺ μ μΈ μ΄λ¦ μ¬μ©: κ° νμ μ λͺ©μ μ λͺ ννκ² λνλ΄λ μ΄λ¦μ μ ννμΈμ.
- νμ μ μ λ¬Έμν: νμ μ μμ λͺ©μ κ³Ό μ¬μ©λ²μ μ€λͺ νκΈ° μν΄ μ£Όμμ μΆκ°νμΈμ. JSDoc μ€νμΌ μ£Όμμ κΆμ₯ν©λλ€.
- μΌκ΄λ μ½λ© μ€νμΌ μ¬μ©: λͺ¨λ Έλ ν¬μ λͺ¨λ ν¨ν€μ§μμ μΌκ΄λ μ½λ© μ€νμΌμ λ°λ₯΄μΈμ. λ¦°ν°μ ν¬λ§·ν°κ° μ΄μ μ μ©ν©λλ€.
- λΉλ λ° ν μ€νΈ μλν: μ½λμ νμ§μ 보μ₯νκΈ° μν΄ μλνλ λΉλ λ° ν μ€νΈ νλ‘μΈμ€λ₯Ό μ€μ νμΈμ.
- λͺ¨λ Έλ ν¬ κ΄λ¦¬ λꡬ μ¬μ©: Lerna, Nx, Turborepoμ κ°μ λꡬλ λͺ¨λ Έλ ν¬μ 볡μ‘μ±μ κ΄λ¦¬νλ λ° λμμ μ€ μ μμ΅λλ€. μ΄λ€μ μ’ μμ± κ΄λ¦¬, λΉλ μ΅μ ν, λ³κ²½ κ°μ§μ κ°μ κΈ°λ₯μ μ 곡ν©λλ€.
λͺ¨λ Έλ ν¬ κ΄λ¦¬ λꡬμ TypeScript
λͺλͺ λͺ¨λ Έλ ν¬ κ΄λ¦¬ λꡬλ TypeScript νλ‘μ νΈμ λν νμν μ§μμ μ 곡ν©λλ€:
- Lerna: JavaScript λ° TypeScript λͺ¨λ Έλ ν¬ κ΄λ¦¬λ₯Ό μν μΈκΈ° μλ λꡬμ λλ€. Lernaλ μ’ μμ± κ΄λ¦¬, ν¨ν€μ§ λ°ν λ° μ¬λ¬ ν¨ν€μ§μμ λͺ λ Ή μ€νμ μν κΈ°λ₯μ μ 곡ν©λλ€.
- Nx: λͺ¨λ Έλ ν¬λ₯Ό μ§μνλ κ°λ ₯ν λΉλ μμ€ν μ λλ€. Nxλ μ¦λΆ λΉλ, μ½λ μμ± λ° μ’ μμ± λΆμ κΈ°λ₯μ μ 곡ν©λλ€. TypeScriptμ μ ν΅ν©λλ©° 볡μ‘ν λͺ¨λ Έλ ν¬ κ΅¬μ‘° κ΄λ¦¬μ νμν μ§μμ μ 곡ν©λλ€.
- Turborepo: JavaScript λ° TypeScript λͺ¨λ Έλ ν¬λ₯Ό μν λ λ€λ₯Έ κ³ μ±λ₯ λΉλ μμ€ν μ λλ€. Turborepoλ μλμ νμ₯μ±μ μν΄ μ€κ³λμμΌλ©°, μ격 μΊμ± λ° λ³λ ¬ μμ μ€νκ³Ό κ°μ κΈ°λ₯μ μ 곡ν©λλ€.
μ΄λ¬ν λꡬλ€μ μ’ μ’ TypeScriptμ λ³΅ν© νλ‘μ νΈ κΈ°λ₯κ³Ό μ§μ ν΅ν©λμ΄ λΉλ νλ‘μΈμ€λ₯Ό κ°μννκ³ λͺ¨λ Έλ ν¬ μ 체μ κ±Έμ³ μΌκ΄λ νμ κ²μ¬λ₯Ό 보μ₯ν©λλ€.
κ²°λ‘
λͺ¨λ Έλ ν¬μμ TypeScript νμ μ ν¨κ³Όμ μΌλ‘ 곡μ νλ κ²μ μ½λ νμ§ μ μ§, μ€λ³΅ κ°μ λ° νμ κ°μ μ μ€μν©λλ€. μ¬λ°λ₯Έ μ λ΅μ μ ννκ³ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ νλ‘μ νΈ μꡬ μ¬νμ λ°λΌ νμ₯ κ°λ₯ν μ ꡬ쑰νλκ³ μ μ§λ³΄μ κ°λ₯ν λͺ¨λ Έλ ν¬λ₯Ό λ§λ€ μ μμ΅λλ€. κ° μ λ΅μ μ₯λ¨μ μ μ μ€νκ² κ³ λ €νκ³ νΉμ μꡬ μ¬νμ κ°μ₯ μ ν©ν κ²μ μ ννμΈμ. λͺ¨λ Έλ ν¬ μν€ν μ²λ₯Ό μ€κ³ν λ μ½λ λͺ νμ±, μ μ§λ³΄μμ± λ° λΉλ μ±λ₯μ μ°μ μνλ κ²μ μμ§ λ§μΈμ.
JavaScript λ° TypeScript κ°λ° νκ²½μ΄ κ³μ λ°μ ν¨μ λ°λΌ λͺ¨λ Έλ ν¬ κ΄λ¦¬μ μ΅μ λꡬ λ° κΈ°μ μ λν μ 보λ₯Ό μ»λ κ²μ΄ νμμ μ λλ€. νλ‘μ νΈκ° μ±μ₯νκ³ λ³νν¨μ λ°λΌ λ€μν μ κ·Ό λ°©μμ μλνκ³ μ λ΅μ μ‘°μ νμΈμ.